﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Host.Encriptacion.logica
{
    class TransformarABinario
    {
        //constructor
        TransformarABinario() { }

        /// <summary>
        /// transforma un string en una cadena de bits (BitArray)
        /// </summary>
        /// <param name="entrada">cadena de caracteres</param>
        /// <returns></returns>
        public static BitArray transformarABinario(string entrada) 
        {
            ASCIIEncoding ascii = new ASCIIEncoding();
            BitArray inverso = new BitArray(64); 
            try
            {
                byte[] arregloBytes = ascii.GetBytes(entrada);
                //IO.ImprimeByteASCII(arregloBytes);
                BitArray arreglobits = new BitArray(arregloBytes);
                //IO.ImprimeBitArray(arreglobits, 8);
                int j = 0;
                for (int i = 0; i < arreglobits.Length; i++)
                {
                    inverso[8*j + (7 - i % 8)] = arreglobits[i];
                    if (i % 8 == 7) j++;
                }
                //IO.ImprimeBitArray(inverso, 4);
                return inverso;
            }
            catch (Exception ex)
            {
                Console.WriteLine("transformaABinario: " + ex.Message);
                return null;
            }
        }

        public static string ToByteArray(BitArray bits)
        {
            ASCIIEncoding ascii = new ASCIIEncoding();
            int numBytes = bits.Count / 8;
            if (bits.Count % 8 != 0) numBytes++;

            byte[] bytes = new byte[numBytes];
            int byteIndex = 0, bitIndex = 0;

            for (int i = 0; i < bits.Count; i++)
            {
                if (bits[i])
                    bytes[byteIndex] |= (byte)(1 << (7 - bitIndex));

                bitIndex++;
                if (bitIndex == 8)
                {
                    bitIndex = 0;
                    byteIndex++;
                }
            }

            //Console.WriteLine(IO.BitArrayToString(bits, 8));

            byte cero = 0;
            for(int i = 0; i < bytes.Length; i++)
            {
                if(bytes[i].Equals(cero))
                {
                    bytes[i] = 32; 
                }
            }

            String decodedString = ascii.GetString(bytes);
            return decodedString;


        }
    }
}
